package com.example.generator.base;

import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Jiamingzhen
 * @Date 2021/4/23 10:03
 * @ClassName AbstractGeneratorConfig
 * @Introduce
 */
public abstract class AbstractGeneratorConfig {
    GlobalConfig gc = new GlobalConfig();
    DataSourceConfig dsc = new DataSourceConfig();
    PackageConfig pc = new PackageConfig();
    TemplateConfig templateConfig = new TemplateConfig();
    StrategyConfig strategy = new StrategyConfig();
    TableInfo tableInfo = null;
    protected abstract void config();
    public void init() {
        config();
    }
    public AbstractGeneratorConfig() {
    }
    public void doMpGeneration() {
        init();

        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        mpg.setGlobalConfig(gc);
        mpg.setDataSource(dsc);
        mpg.setPackageInfo(pc);

        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };

        /**************** 生成mapper.xml **************************/
        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig("/templates/temp/mapper.xml.vm") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
                return System.getProperty("user.dir") + "/src/main/resources/mapper/" + pc.getModuleName()
                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);

        /**************** 生成列表详情页 **************************/
        focList.add(new FileOutConfig("/templates/temp/page.html.vm") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                System.out.println("========生成page_html成功==========文件位置="+ System.getProperty("user.dir")+"/src/main/resources/templates/view/" + pc.getModuleName() + "/"+tableInfo.getEntityPath()+".html");

                // 自定义输入文件名称
                return  System.getProperty("user.dir")+"/src/main/resources/templates/view/" + pc.getModuleName() +"/"+ tableInfo.getEntityPath()+".html";
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);

        /**************** 生成添加页 **************************/
        focList.add(new FileOutConfig("/templates/temp/page_add.html.vm") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                System.out.println("========生成page_html成功==========文件位置="+ System.getProperty("user.dir")+"/src/main/resources/templates/view/" + pc.getModuleName() + "/"+tableInfo.getEntityPath()+".html");

                // 自定义输入文件名称
                return  System.getProperty("user.dir")+"/src/main/resources/templates/view/" + pc.getModuleName() +"/"+ tableInfo.getEntityPath()+"_add.html";
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);

        /**************** 生成修改页 **************************/
        focList.add(new FileOutConfig("/templates/temp/page_edit.html.vm") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                System.out.println("========生成page_html成功==========文件位置="+ System.getProperty("user.dir")+"/src/main/resources/templates/view/" + pc.getModuleName() + "/"+tableInfo.getEntityPath()+".html");

                // 自定义输入文件名称
                return  System.getProperty("user.dir")+"/src/main/resources/templates/view/" + pc.getModuleName() +"/"+ tableInfo.getEntityPath()+"_edit.html";
            }
        });

        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);

        /**************** 生成详情页 **************************/
        focList.add(new FileOutConfig("/templates/temp/page_view.html.vm") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                System.out.println("========生成page_html成功==========文件位置="+ System.getProperty("user.dir")+"/src/main/resources/templates/view/" + pc.getModuleName() + "/"+tableInfo.getEntityPath()+".html");

                // 自定义输入文件名称
                return  System.getProperty("user.dir")+"/src/main/resources/templates/view/" + pc.getModuleName() +"/"+ tableInfo.getEntityPath()+"_view.html";
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);

        mpg.setTemplate(templateConfig);
        mpg.setStrategy(strategy);
        mpg.setTemplateEngine(new VelocityTemplateEngine());
        mpg.execute();
        List<TableInfo> tableInfoList = mpg.getConfig().getTableInfoList();
        if (tableInfoList != null && tableInfoList.size() > 0) {
            this.tableInfo = tableInfoList.get(0);
        }
    }
}
